home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / cryptdevice / idea68k.a < prev    next >
Text File  |  1980-01-03  |  7KB  |  379 lines

  1. ;-------------------------------------------------------------------------
  2. ; idea68k.a 
  3. ;
  4. ; New version of assembler idea cipher
  5. ;
  6. ; Author: Risto Paasivirta <paasivir@jyu.fi>
  7. ;
  8. ;-------------------------------------------------------------------------
  9. ;
  10.  
  11.         section    text,code
  12.  
  13. ;-------------------------------------------------------------------------
  14. ; Functions defined in this module
  15. ;-------------------------------------------------------------------------
  16. ; Internal functions
  17.  
  18.  
  19.         xdef    __mul_idea        ; mul mod 65537
  20.         xdef    __inv_idea        ; inv mod 65537
  21.         xdef    __en_key_idea        ; userkey to encrypt subk.
  22.         xdef    __de_key_idea        ; invert subkey
  23.         xdef    __cipher_idea        ; cipher core
  24.  
  25. ;-------------------------------------------------------------------------
  26. ; Key handling
  27.  
  28.         xdef    _idea_key_schedule    ; full key schedule
  29.  
  30. ;-------------------------------------------------------------------------
  31. ; En/Decryption
  32.  
  33.         xdef    _idea_ebc_encrypt    ; electronic code book
  34.         xdef    _idea_cbc_encrypt    ; cipher block chaining
  35.  
  36. ;-------------------------------------------------------------------------
  37. ; Constants
  38. ;-------------------------------------------------------------------------
  39. ; subkey size
  40.  
  41. ZSIZE        equ    108
  42.  
  43. ;-------------------------------------------------------------------------
  44. ; Internal functions
  45. ;-------------------------------------------------------------------------
  46. ; macro: imul dea,dn , d7=scratch
  47. ; Arg 1 accessed only once (can be (an)+) Handles zero value arguments.
  48. ;
  49.  
  50. imul        macro
  51.         move.w    \2,d7
  52.         beq.b    imul0\@
  53.         mulu.w    \1,d7
  54.         beq.b    imul1\@
  55.         move.w    d7,\2
  56.         swap    d7
  57.         sub.w    d7,\2
  58.         moveq    #0,d7
  59.         addx.w    d7,\2    
  60.         bra.b    imul3\@
  61.  
  62. imul0\@        move.w    \1,\2        
  63. imul1\@        neg.w    \2
  64.         addq.w    #1,\2
  65. imul3\@
  66.         endm
  67.  
  68. ;-------------------------------------------------------------------------
  69. ; word16 _mul_idea(word16 a,word16 b)
  70. ;
  71. ; Return a * b mod 65537
  72.  
  73. __mul_idea    move.l    d7,-(sp)
  74.         move.w    10(sp),d0
  75.         imul    14(sp),d0
  76.         move.l    (sp)+,d7
  77.         rts
  78.  
  79. ;-------------------------------------------------------------------------
  80. ; word16 _inv_idea(word16 a)
  81. ; d0 = inv(d0)
  82. ;
  83. ; Return multiplicative inverse of a mod 65537
  84. ;
  85.  
  86. __inv_idea    move.w    6(sp),d0
  87.  
  88. inv        cmp.w    #2,d0        ; inv(0)=0,inv(1)=1
  89.         bcs.b    1$
  90.  
  91.         cmp.w    #3,d0
  92.         bcc.b    2$
  93.  
  94.         move.w    #32769,d0    ; inv(2)
  95. 1$        rts
  96.  
  97. 2$        movem.l    d2-d5,-(sp)
  98.         move.l    #$10001,d1    ; d1 = n1
  99.         moveq    #1,d2        ; d2 = b2
  100.         moveq    #0,d3        ; d3 = b1        
  101.  
  102. inv_loop    divu.w    d0,d1
  103.         move.l    d1,d4
  104.         swap    d4        ; r = d4
  105.         tst.w    d4
  106.         beq.b    inv_done
  107.  
  108.         move.w    d2,d5
  109.         muls.w    d1,d5
  110.         exg    d3,d2
  111.         sub.l    d5,d2
  112.         moveq    #0,d1
  113.         move.w     d0,d1
  114.         move.w    d4,d0
  115.         bra.b    inv_loop
  116.  
  117. inv_done    tst.l    d2
  118.         bpl.b    1$
  119.  
  120.         move.l    #$10001,d0
  121.         add.l    d2,d0
  122.         bra.b    2$
  123.  
  124. 1$        move.l    d2,d0
  125.  
  126. 2$        movem.l    (sp)+,d2-d5
  127.         rts
  128.  
  129. ;-------------------------------------------------------------------------
  130. ; _en_key_idea(a0=userkey,a1=subkey)
  131. ;
  132. ; Create 54-word encryption subkey from 8-word user key
  133. ;
  134.  
  135. __en_key_idea    movem.l    4(sp),a0-a1
  136.  
  137. en_key_idea    movem.l    d2-d4,-(sp)
  138.         move.l    (a0)+,(a1)+
  139.         move.l    (a0)+,(a1)+
  140.         move.l    (a0)+,(a1)+
  141.         move.l    (a0)+,(a1)
  142.  
  143.         suba.w    #12,a1
  144.  
  145.         moveq    #47,d0
  146.         moveq    #0,d1
  147.         moveq    #14,d4
  148.  
  149. 1$        move.w    d1,d2
  150.         addq.w    #2,d2
  151.         and.w    d4,d2
  152.         move.w    0(a1,d2.w),d3
  153.         swap    d3
  154.         addq.w    #2,d2
  155.         and.w    d4,d2
  156.         move.w    0(a1,d2.w),d3
  157.         lsr.l    #7,d3
  158.         move.w    d3,16(a1,d1.w)
  159.         addq.w    #2,d1
  160.         move.w    d1,d2
  161.         and.w    #16,d2
  162.         adda.w    d2,a1
  163.         and.w    d4,d1
  164.         dbra    d0,1$
  165.  
  166.         movem.l    (sp)+,d2-d4
  167.         rts
  168.  
  169. ;-------------------------------------------------------------------------
  170. ; _de_key_idea(a0=subkey,a1=inverted_subkey)
  171. ;
  172. ; Invert 54-word subkey for idea decrypting
  173. ;
  174.  
  175. __de_key_idea    movem.l    4(sp),a0-a1
  176.  
  177. de_key_idea    movem.l    d2-d3,-(sp)
  178.  
  179.         moveq    #96,d2
  180.         moveq    #0,d3
  181.         bra.b    2$
  182.  
  183. 1$        move.l    8(a0,d2.w),-4(a1,d3.w)
  184.  
  185. 2$        move.w    0(a0,d2.w),d0
  186.         bsr    inv
  187.         move.w    d0,0(a1,d3.w)
  188.         move.l    2(a0,d2.w),d0
  189.         neg.w    d0
  190.         swap    d0
  191.         neg.w    d0
  192.         move.l    d0,2(a1,d3.w)
  193.         move.w    6(a0,d2.w),d0
  194.         bsr    inv
  195.         move.w    d0,6(a1,d3.w)
  196.         add.w    #12,d3
  197.         sub.w    #12,d2
  198.         bcc.b    1$
  199.  
  200.         move.l    2(a1),d0
  201.         swap    d0
  202.         move.l    d0,2(a1)
  203.         move.l    98(a1),d0
  204.         swap    d0
  205.         move.l    d0,98(a1)
  206.  
  207.         movem.l    (sp)+,d2-d3
  208.         rts
  209.  
  210. ;-------------------------------------------------------------------------
  211. ; _cipher_idea(a0=src,a1=dest,a2=subkey)
  212. ;
  213. ; En/Decipher 4-word block from src to dest using 54-word subkey as key
  214. ;
  215.  
  216. round        macro
  217.         imul    (a0)+,d0
  218.         add.w    (a0)+,d1        
  219.         add.w    (a0)+,d2
  220.         imul    (a0)+,d3
  221.         move.w    d0,d4
  222.         eor.w    d2,d4
  223.         imul    (a0)+,d4
  224.  
  225.         move.w    d1,d5
  226.         eor.w    d3,d5
  227.         add.w    d4,d5
  228.         imul    (a0)+,d5
  229.         move.w    d5,d6
  230.         add.w    d4,d6
  231.  
  232.         eor.w    d5,d0
  233.         move.w    d1,d4
  234.         move.w    d2,d1
  235.         eor.w    d5,d1
  236.         move.w    d4,d2
  237.         eor.w    d6,d2
  238.         eor.w    d6,d3
  239.         endm
  240.  
  241. __cipher_idea    move.l    a2,-(sp)
  242.         movem.l    8(sp),a0-a2
  243.         bsr.b    cipher_idea
  244.         move.l    (sp)+,a2
  245.         rts
  246.  
  247. cipher_idea    movem.l    d2-d7,-(sp)
  248.         movem.w    (a0),d0-d3
  249.         movea.l    a2,a0
  250.  
  251.         ifnd    UNROLL
  252.         moveq    #7,d6
  253. cipher_loop    swap    d6
  254.         round
  255.         swap    d6
  256.         dbra    d6,cipher_loop
  257.         endc
  258.  
  259.         ifd    UNROLL
  260.         round
  261.         round
  262.         round
  263.         round
  264.         round
  265.         round
  266.         round
  267.         round
  268.         endc
  269.  
  270.         imul    (a0)+,d0
  271.         exg    d1,d2
  272.         add.w    (a0)+,d1
  273.         add.w    (a0)+,d2
  274.         imul    (a0)+,d3
  275.  
  276.         movem.w    d0-d3,(a1)
  277.         movem.l    (sp)+,d2-d7
  278.         rts
  279.  
  280. ;-------------------------------------------------------------------------
  281. ; User callable routines 
  282. ;-------------------------------------------------------------------------
  283. ; idea_key_schedule(word16 *uk, word16 *ks)
  284. ;
  285. ; Create en/decryption keys from 8-word user key uk to 108-word key 
  286. ; schedule ks.
  287. ;
  288.  
  289. _idea_key_schedule
  290.         movem.l    4(sp),a0-a1
  291.         bsr    en_key_idea
  292.         movea.l    8(sp),a0
  293.         movea.l    a0,a1
  294.         adda.w    #ZSIZE,a1
  295.         bra    de_key_idea
  296.  
  297. ;-------------------------------------------------------------------------
  298. ; idea_ebc_encrypt(word16 *src,word16 *dst,word16 *ks,int mode)
  299. ;
  300. ; En/decrypt 4 word (8-byte) block from src to dst using electronic code
  301. ; book mode.
  302. ;
  303.  
  304. _idea_ebc_encrypt
  305.         move.l    a2,-(sp)
  306.         movem.l    8(sp),a0-a2/d0
  307.         tst.l    d0
  308.         bne.l    1$
  309.         adda.w    #ZSIZE,a2
  310.         bsr    cipher_idea
  311.         movea.l    (sp)+,a2
  312.         rts
  313.  
  314. ;-------------------------------------------------------------------------
  315. ; idea_cbc_encrypt(word16 *src, word16 *dst, int len, word16 *ks,
  316. ;   word16 *ivec,int mode)
  317. ;
  318. ; Encrypt (mode != 0) or decrypt (mode == 0) src to dst in cipher block 
  319. ; chaining mode. Len must be multiple of 8 bytes. Ivec contains final
  320. ; vector at return.
  321. ;
  322.  
  323. _idea_cbc_encrypt
  324.         movem.l    a2-a5/d2-d4,-(sp)
  325.  
  326.         lea    32(sp),a0
  327.         move.l    (a0)+,a3    ; src
  328.         move.l    (a0)+,a4    ; dst
  329.         move.l    (a0)+,d2    ; len
  330.         move.l    (a0)+,a2    ; ks
  331.         move.l    (a0)+,a5    ; ivec
  332.  
  333.         tst.l    (a0)        ; mode?
  334.         beq    cbc_decrypt
  335.  
  336. cbc_en_loop    move.l    (a3)+,d3    ; get data to encrypt
  337.         move.l    (a3)+,d4
  338.         eor.l    d3,(a5)        ; eor with ivec        
  339.         eor.l    d4,4(a5)
  340.  
  341.         movea.l    a5,a0        ; cipher ivec to dst
  342.         movea.l    a4,a1
  343.         bsr    cipher_idea
  344.         move.l    (a4)+,(a5)    ; copy cipher to ivec
  345.         move.l    (a4)+,4(a5)
  346.  
  347.         subq    #8,d2
  348.         bhi.b    cbc_en_loop
  349.         
  350. cbc_exit    movem.l    (sp)+,a2-a5/d2-d4
  351.         rts
  352.  
  353. cbc_decrypt    adda.w    #ZSIZE,a2    ; decrypt key
  354.  
  355. cbc_de_loop    move.l    (a3)+,d3    ; store cipher data (next ivec)
  356.         move.l    (a3)+,d4
  357.  
  358.         lea    -8(a3),a0    ; decrypt to src
  359.         movea.l    a4,a1
  360.         bsr    cipher_idea
  361.  
  362.         move.l    (a5)+,d0    ; swap next/curr ivec
  363.         move.l    (a5),d1
  364.         move.l    d4,(a5)
  365.         move.l    d3,-(a5)
  366.  
  367.         eor.l    d0,(a4)+    ; eor deciphered with ivec
  368.         eor.l    d1,(a4)+
  369.  
  370.         subq    #8,d2
  371.         bhi.b    cbc_de_loop
  372.  
  373.         bra.b    cbc_exit
  374.  
  375. ;-------------------------------------------------------------------------
  376.         end
  377. ;-------------------------------------------------------------------------
  378.  
  379.